Skip to content

01 别动,定 - taskset 与进程绑核

CPU 调度

  • CPU 调度(CPU Scheduling)是操作系统内核的一个重要功能,负责决定哪个进程或线程在何时获得 CPU 资源。
  • CPU 调度器的目标是最大化 CPU 利用率、最小化响应时间、确保公平性,并满足各种系统需求。Linux 内核提供了多种调度策略和算法,以适应不同的工作负载和性能需求。
  • 在多任务操作系统中,多个进程可以同时运行,但 CPU 核心的数量有限,因此需要有效的调度算法来管理这些任务的执行顺序,确保系统资源得到合理的分配并保持系统的响应性。
  • 调度依据:进程的优先级、进程的等待时间、进程需要的资源等;
  • taskset:人为设定进程运行的 CPU

进程与线程

  • 进程:一个独立的执行环境,包括代码、数据、堆栈和资源。
  • 线程:进程内的一个执行单元,共享进程的资源,但有自己的堆栈和寄存器状态。

CPU 调度与绑核

  • 默认情况下,操作系统根据进程的优先级、进程的等待时间、进程需要的资源等信息,调度不同的进程在 CPU 上运行,尽可能保证各 CPU 之间负载均衡;
  • 在某些应用场景(如程序性能优化等)中,就有必要考虑将其绑定到 CPU 或 CPU 组上运行,以减小由于在不同的核上调度造成的开销

taskset

  • taskset 是 Linux 中用于设置或查看进程的 CPU 亲和性(CPU affinity)的一种工具。
  • 通过使用 taskset,我们可以将进程(或线程)绑定到特定的 CPU 核心上运行,避免进程在多个 CPU 核心之间频繁切换。这种操作可以帮助提高进程的性能,特别是在多核 CPU 的场景下。

CPU 亲和性 CPU Affinity

CPU 亲和性(CPU affinity)是指进程与 CPU 核心之间的绑定关系。通过设置 CPU 亲和性,可以确保进程在指定的 CPU 核心上运行,而不是在系统中的任意核心上运行。这种绑定可以用于以下几个目的:

  • 提高缓存命中率:如果一个进程总是在同一个 CPU 核心上运行,那么它会更频繁地使用该核心的缓存,从而提高缓存命中率,减少内存访问延迟。
  • 减少上下文切换(Context Switch):将进程绑定到特定的 CPU 核心上可以减少 CPU 核心之间的上下文切换,从而减少调度开销。
  • 隔离进程:在多核系统中,可以将不同的进程绑定到不同的 CPU 核心上,以实现进程之间的隔离,避免相互干扰。

taskset 命令

taskset 是用于设置或查看进程的 CPU 亲和性的命令。它的基本用法包括:

  • 设置 CPU 亲和性:将进程或命令绑定到某些 CPU 核心上。
  • 查看 CPU 亲和性:查看某个进程目前可以在哪些 CPU 核心上运行。
bash
taskset [options] [mask | CPU-list] [pid | command [arguments]]
  • mask | CPU-list:定义了将进程绑定到哪些 CPU 核心。可以用 CPU 掩码(mask)或 CPU 列表(list)形式来指定。
  • pid:要查看或修改的进程 ID。
  • command:要绑定 CPU 核心的命令。

参数解释

  • CPU 掩码(mask):用十六进制数表示绑定的 CPU 核心。掩码中的每一位表示一个 CPU 核心,如果该位为 1,表示允许进程在该 CPU 上运行。例如:
    • 0x1:表示绑定到 CPU 0。
    • 0x3:表示绑定到 CPU 0 和 CPU 1(0011)。
  • CPU 列表(list):直接用逗号分隔的 CPU 核心号表示,或者用 - 表示连续的 CPU 核心范围。例如:
    • 0:表示绑定到 CPU 0。
    • 0,1,2:表示绑定到 CPU 0、1 和 2。
    • 0-3:表示绑定到 CPU 0、1、2 和 3。

CPU 亲和性掩码的表示方法

CPU 亲和性掩码可以用多种方式表示:

  • 十六进制:例如 0x01 表示只允许在 CPU0 上运行,0x03 表示允许在 CPU0 和 CPU1 上运行。
  • 二进制:例如 0001 表示只允许在 CPU0 上运行,0011 表示允许在 CPU0 和 CPU1 上运行。
  • 十进制:例如 1 表示只允许在 CPU0 上运行,3 表示允许在 CPU0 和 CPU1 上运行。

常用示例

  1. 查看进程 CPU 亲和性taskset -p <pid>
  2. 设置已有进程的 CPU 亲和性taskset -p <mask> <pid>
  3. 启动新进程并设置 CPU 亲和性taskset <mask> <command>taskset -c <CPU-list> <command>

查看进程的 CPU 亲和性

bash
taskset -p <pid> # 以二进制掩码形式查看 PID 的 CPU 亲和性(所允许调度运行的 CPU 核心)
taskset -cp <pid> # 以列表形式查看 PID 的 CPU 亲和性

  ~ taskset -p 1234 # 查看 PID 为 1234 的进程的 CPU 亲和性掩码
pid 1234's current affinity mask: 3 # 表明该进程可以在 CPU 0 和 CPU 1 上运行(`0x3`,即 `0011`,表示 CPU 0 和 1)

➜  ~ taskset -cp 1234 # 以列表形式查看 PID 为 1234 的进程的 CPU 亲和性
pid 1234's current affinity list: 0,1 # 表明该进程可以在 CPU 0 和 CPU 1 上运行

绑定进程到指定的 CPU 核心

修改现有进程的 CPU 亲和性:可以通过 taskset 命令将某个运行中的进程绑定到特定的 CPU 核心。

bash
taskset -p <mask> <pid>

  ~ taskset -p 0x1 1234 # 将 PID 为 1234 的进程绑定到 CPU 0 上
  ~ taskset -p 0x03 1234 # 把进程 ID 为 1234 的进程的 CPU 亲和性设置为允许在 CPU0 和 CPU1 上运行

  ~ taskset -cp 0,1 1235
# 使用 taskset 命令将 PID 为 1235 的进程绑定到 CPU 0 和 CPU 1
# -c 表示使用 CPU 核心列表方式,p 表示针对已有进程
# 0,1 表示将进程绑定到 CPU 0 和 CPU 1
# 1235 是目标进程的 PID

pid 1235's current affinity list: 0-3 # 当前 PID 为 1235 的进程可以在 CPU 0-3(即 4 个 CPU 核心)上运行

pid 1235's new affinity list: 0,1 # 新的亲和性设置为 CPU 0 和 CPU 1,现在该进程只能在这两个核心上运行


  ~ taskset -p 0x1 1235
# 使用 taskset 命令将 PID 为 1235 的进程绑定到 CPU 0 上运行
# -p 表示针对已有进程,0x1 是十六进制的 CPU 掩码,表示只允许进程在 CPU 0 上运行
# 0x1 的二进制为 0001,对应 CPU 0
# 1235 是目标进程的 PID

pid 1235's current affinity mask: f # 当前 PID 为 1235 的进程亲和性掩码为 f(十六进制),表示 CPU 0-3(四个核心)都可运行
# f 的二进制为 1111,表示 CPU 0, 1, 2 和 3 都启用

pid 1235's new affinity mask: 1 # 新的亲和性掩码为 1,表示进程现在只能在 CPU 0 上运行。
# 1 的二进制为 0001,表示只启用第 0 个 CPU 核心。

直接绑定新进程到特定的 CPU 核心

启动一个新进程并绑定到指定 CPU 核心:除了对已有进程修改 CPU 亲和性,还可以在启动进程时直接指定它运行在哪些 CPU 上。

bash
taskset <mask> <command> # 以二进制掩码形式设定 CPU 调度列表并启动进程

  ~ taskset 0x3 ./my_program # 运行 my_program 并绑定到 CPU 0 和 CPU 1
[1] 1234
  ~ taskset 0x1 bash process.sh & # 启动一个后台进程,并将其绑定到 CPU 0 上运行
[2] 1235
  ~ taskset 0x01 ./my_program # 启动 my_program 进程,并将其绑定到 CPU 0 上运行
  ~ taskset -c 0,1 ./my_program # 使用 CPU 列表的方式

  ~ taskset -p 1234 # 查看进程 1234 的 CPU 亲和性
pid 1234's current affinity mask: 3 # 表明该进程可以在 CPU 0 和 CPU 1 上运行

解除 CPU 绑定

如果想让某个进程可以在所有 CPU 上运行,恢复默认调度,可以通过指定所有 CPU 掩码。

bash
# 系统有 4 个 CPU 核心,将进程绑定回所有核心
  ~ taskset -p 0xf <pid> # 0xf 表示可以在所有 4 个 CPU 核心上运行(`1111`)

进程绑核的实际应用

  • 提高性能:在某些情况下,将进程绑定到特定的 CPU 核心上可以提高性能。例如,对于计算密集型任务,如果进程总是在同一个 CPU 核心上运行,那么它可以更有效地利用该核心的缓存,从而减少内存访问延迟。
  • 隔离进程:在多核系统中,可以将不同的进程绑定到不同的 CPU 核心上,以实现进程之间的隔离。例如,可以将一个高优先级的进程绑定到一个特定的 CPU 核心上,以确保它不会受到其他低优先级进程的干扰。
  • 负载均衡:在某些情况下,可以通过将进程绑定到特定的 CPU 核心上来实现负载均衡。例如,可以将多个进程分别绑定到不同的 CPU 核心上,以确保每个核心的负载相对均衡。

进程绑核的优缺点

  • 优点

    • 减少上下文切换:进程在不同 CPU 核心之间频繁切换会导致 CPU 缓存失效,从而影响性能。绑定到固定 CPU 核心可以避免这种情况。
    • 提高性能:在多核环境下,一些实时应用或高性能计算应用可能需要严格的 CPU 绑定来优化性能,减少调度开销。
  • 缺点

    • 资源利用不均衡:如果系统中有多个进程被绑定到相同的 CPU 核心,可能导致某些核心负载过重,而其他核心闲置。
    • 灵活性降低:默认情况下,内核调度程序会根据系统负载动态调整进程的运行位置。绑定 CPU 可能会减少系统的调度优化空间。

taskset 的主要应用场景

  • 提高进程性能:避免进程在不同的 CPU 核心之间频繁切换以提高进程的性能;
  • 避免进程抢占:避免进程抢占 CPU 资源,从而提高系统的整体性能;
  • 限制进程 CPU 使用率:避免进程占用过多 CPU 资源导致其他进程性能下降;
  • 调试进程:避免进程在不同的 CPU 核间频繁切换,从而更容易地观察进程的行为。

top 中查看进程 PID 的 CPU 位置

使用 top 命令查看某个进程的 CPU 位置(即哪个 CPU 核心正在执行该进程):可以通过启用 P 列(即处理器编号列)来实现。

  1. 打开 top 命令:

  2. top 命令界面中,按下键盘的 f 键,进入字段管理模式。

  3. 使用方向键,选择 P = Last Used Cpu (SMP)(P 列显示每个进程当前运行在哪个 CPU 核心上,能够显示该命令最后使用的 CPU)。此时应该会有一个 * 星号标记在 P = Last Used Cpu (SMP) 前面。

    57dae436-b2f6-461d-9e60-1ca77e389d8c

  4. Esc/q 键,返回 top 的主界面。

  5. 现在在 top 命令界面中,你将看到每个进程对应的 P 列显示的是该进程当前运行在哪个 CPU 核心上。

    d09c0aa7-98db-483c-bb4c-921ad7524682

TIP

taskset 显示的是所允许的 CPU 调度列表;top 显示的是上一个周期所在 CPU;

  1. top 命令

    • top 命令中的 P 列显示 当前时刻 某个进程正在使用的 CPU 核心编号。这是一个动态的、实时变化的值。由于现代操作系统和调度器(如 Linux 的 CFS 调度器)会不断地在多个 CPU 核心之间调度任务,某个进程可能频繁地从一个核心迁移到另一个核心,所以 top 看到的是 实时瞬间 的 CPU 使用情况。
    • 例如,某个进程可能此时运行在 CPU 核心 0 上,但在下一时刻被调度到 CPU 核心 2,top 显示的是当前它在哪个核心上。
  2. taskset 命令

    • taskset 命令则是用来查看或者设置进程的 CPU 亲和性(CPU Affinity),即允许该进程在哪些 CPU 核心上运行。它显示的不是进程此刻在哪个核心上运行,而是进程被限制可以运行在哪些核心上。
    • CPU 亲和性可以指定一个进程只能在特定的 CPU 核心上运行,限制其调度范围。通过 taskset,你可以看到一个进程当前被分配的 CPU 集合(可能是多个 CPU 核心)。
    • 例如,taskset -p 1234 可能会显示某个进程可以在 CPU 0 和 CPU 1 上运行,而具体它此时在哪个 CPU 核心上运行要用 top 或其他工具来查看。

区别总结:

  • top 显示的是进程 当前时刻 运行在哪个 CPU 核心上,这个核心号会动态变化。
  • taskset 显示的是进程的 CPU 亲和性,即允许该进程在哪些 CPU 核心上执行,这个范围通常是固定的,除非手动修改。

因此,top 适合用于查看进程的 实时 CPU 位置,而 taskset 用于查看和修改进程的 可用 CPU 范围

实验代码

查看 CPU 信息

使用 lscpu 命令查看 CPU 信息。这里主要查看 CPU(s) (CPU 核心数)和 On-line CPU(s) list (在线的 CPU 核心列表),方便后续实验时确认 CPU 核心数和编号,用于使用 taskset 命令绑定进程到指定的 CPU 核心。

查看 CPU 信息
bash
  ~ lscpu # 查看 CPU 信息
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          48 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   4 # 这里可以看到有 4 个 CPU 核心
  On-line CPU(s) list:    0-3 # 这里可以看到 4 个 CPU 核心的编号
Vendor ID:                AuthenticAMD
  BIOS Vendor ID:         Smdbmds
  Model name:             AMD EPYC 7K62 48-Core Processor
    BIOS Model name:      3.0
    CPU family:           23
    Model:                49
    Thread(s) per core:   1
    Core(s) per socket:   4
    Socket(s):            1
    Stepping:             0
    BogoMIPS:             5190.24
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflus
                          h mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good n
                          opl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_
                          2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy
                          cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsb
                          ase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xget
                          bv1 arat
Virtualization features:
  Hypervisor vendor:      KVM
  Virtualization type:    full
Caches (sum of all):
  L1d:                    128 KiB (4 instances)
  L1i:                    128 KiB (4 instances)
  L2:                     16 MiB (4 instances)
  L3:                     16 MiB (1 instance)
NUMA:
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-3
Vulnerabilities:
  Gather data sampling:   Not affected
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Not affected
  Reg file data sampling: Not affected
  Retbleed:               Mitigation; untrained return thunk; SMT disabled
  Spec rstack overflow:   Vulnerable: Safe RET, no microcode
  Spec store bypass:      Vulnerable
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Retpolines; IBPB conditional; STIBP disabled; RSB filling; PBRSB-e
                          IBRS Not affected; BHI Not affected
  Srbds:                  Not affected
  Tsx async abort:        Not affected

安装 stress-ng 压力测试工具

安装 stress-ng 压力测试工具stress-ng 是一个强大的压力测试工具,可以用来测试系统的稳定性和性能。

安装 stress-ng 压力测试工具
bash
  ~ yum search stress # 搜索压力测试工具
==================================== Name & Summary Matched: stress ====================================
stress-ng.x86_64 : Stress test a computer system in various ways
  ~ sudo dnf install stress-ng
Dependencies resolved.
========================================================================================================
 Package                   Architecture        Version                     Repository              Size
========================================================================================================
Installing:
 stress-ng                 x86_64              0.17.08-2.el9               appstream              2.6 M
Installing dependencies:
 Judy                      x86_64              1.0.5-28.el9                appstream              129 k
 lksctp-tools              x86_64              1.0.19-2.el9                baseos                  94 k

Transaction Summary
========================================================================================================
Install  3 Packages

Total download size: 2.8 M
Installed size: 10 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): Judy-1.0.5-28.el9.x86_64.rpm                                     629 kB/s | 129 kB     00:00
(2/3): lksctp-tools-1.0.19-2.el9.x86_64.rpm                             448 kB/s |  94 kB     00:00
(3/3): stress-ng-0.17.08-2.el9.x86_64.rpm                               4.0 MB/s | 2.6 MB     00:00
--------------------------------------------------------------------------------------------------------
Total                                                                   4.3 MB/s | 2.8 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                1/1
  Installing       : lksctp-tools-1.0.19-2.el9.x86_64                                               1/3
  Installing       : Judy-1.0.5-28.el9.x86_64                                                       2/3
  Installing       : stress-ng-0.17.08-2.el9.x86_64                                                 3/3
  Running scriptlet: stress-ng-0.17.08-2.el9.x86_64                                                 3/3
  Verifying        : Judy-1.0.5-28.el9.x86_64                                                       1/3
  Verifying        : stress-ng-0.17.08-2.el9.x86_64                                                 2/3
  Verifying        : lksctp-tools-1.0.19-2.el9.x86_64                                               3/3

Installed:
  Judy-1.0.5-28.el9.x86_64     lksctp-tools-1.0.19-2.el9.x86_64     stress-ng-0.17.08-2.el9.x86_64

Complete!

启动压力测试工具

  • 使用 stress-ng --cpu 1 & 命令启动压力测试工具,--cpu 1 表示使用 1 个 CPU 核心,& 表示在后台运行。
  • 使用 taskset -p 4116040 命令查看进程的 CPU 亲和性。
启动压力测试工具
bash
  ~ stress-ng --cpu 1 &  # 启动压力测试工具 'stress-ng',使用1个CPU模拟负载,并将其放入后台运行
[1] 4116040  # [1] 表示这是后台的第一个任务,4116040 是进程 ID

  ~ stress-ng: info:  [4116040] defaulting to a 1 day, 0 secs run per stressor
stress-ng: info:  [4116040] dispatching hogs: 1 cpu  # 'stress-ng' 工具默认运行时间为 1 天,并且分配1个CPU进行压力测试

  ~ taskset -p 4116040  # 使用 'taskset' 工具查看进程 ID 为 4116040 的 CPU 亲和性(即在哪些 CPU 核心上运行)
pid 4116040's current affinity mask: f  # 输出的 'f'(16进制)表示该进程可以运行在所有的 CPU 核心上(CPU 0, 1, 2, 3)
# f 的二进制为 1111,表示 CPU 0, 1, 2 和 3 都启用

➜  ~ stress-ng --cpu 1 &  # 再启动一个 'stress-ng' 进程,同样是使用1个CPU模拟负载,并且放入后台
[2] 4116409  # 这是后台的第二个任务,进程 ID 为 4116409

➜  ~ stress-ng: info:  [4116409] defaulting to a 1 day, 0 secs run per stressor
stress-ng: info:  [4116409] dispatching hogs: 1 cpu  # 新的 'stress-ng' 进程同样会默认运行1天,并分配1个CPU进行测试

➜  ~ taskset -p 4116409  # 查看第二个 'stress-ng' 进程的 CPU 亲和性
pid 4116409's current affinity mask: f  # 输出 'f' 表示该进程也可以运行在所有 CPU 核心上(CPU 0, 1, 2, 3)

查看系统状态

  • 使用 top 命令查看系统状态。
  • 使用 top 命令的 P 列查看哪个 CPU 核心正在执行压力测试工具。
查看系统状态
bash
  ~ top # 查看系统状态
top - 21:20:24 up 65 days, 12:08,  2 users,  load average: 2.38, 1.20, 0.52
Tasks: 134 total,   3 running, 131 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.6 sy, 50.1 ni, 48.8 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3658.8 total,    176.9 free,   2652.6 used,   1127.3 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1006.2 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                        P
4116044 root      25   5   37424   8052   3968 R 100.0   0.2   2:00.95 stress-ng-cpu                  3
4116413 root      25   5   37424   6840   3840 R 100.0   0.2   1:28.00 stress-ng-cpu                  1
3248246 root      20   0  632972  25296   5376 S   1.0   0.7 194:09.38 barad_agent                    1
3342034 root      20   0 1047928 130120  32224 S   1.0   3.5 180:47.52 YDService                      0
4046878 root      20   0    4740   3200   2944 S   0.3   0.1   0:05.01 zsh                            2
      1 root      20   0  171912  11392   6912 S   0.0   0.3   7:36.23 systemd                        2

这里可以看到两个压力测试工具暂时在 CPU 核心 3 和 CPU 核心 1 上运行(P 列显示的值为 3 和 1,top 命令的 P 列显示的是当前正在运行的 CPU 核心,这个值会动态变化)。CPU 使用率达到了 100%。

绑定进程到指定 CPU 核心

  • 使用 taskset -p 0x1 4116044 命令将进程绑定到 CPU 核心 0。
  • 使用 taskset -p 0x1 4116413 命令将进程绑定到 CPU 核心 0。
绑定进程到指定 CPU 核心
bash
  ~ taskset -p 0x1 4116044  # 使用 'taskset' 将进程 ID 为 4116044 的 CPU 亲和性设置为 0x1(即只允许使用 CPU 0 核心)
pid 4116044's current affinity mask: f  # 当前的 CPU 亲和性掩码是 'f',表示进程可以运行在所有 CPU 核心上(CPU 0, 1, 2, 3)
pid 4116044's new affinity mask: 1  # 设置了新的 CPU 亲和性掩码 '1',表示该进程只能在 CPU 0 核心上运行

  ~ taskset -p 0x1 4116413  # 同样地,将进程 ID 为 4116413 的 CPU 亲和性也设置为 0x1(只能使用 CPU 0 核心)
pid 4116413's current affinity mask: f  # 当前的 CPU 亲和性掩码是 'f',进程可以使用所有 CPU 核心
pid 4116413's new affinity mask: 1  # 设置后的亲和性掩码为 '1',表示进程只能使用 CPU 0

再次查看系统状态

再次查看系统状态
bash
  ~ top
top - 21:21:28 up 65 days, 12:09,  2 users,  load average: 2.44, 1.45, 0.65
Tasks: 134 total,   3 running, 131 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.8 sy, 25.1 ni, 73.4 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3658.8 total,    175.9 free,   2653.4 used,   1127.4 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1005.3 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                        P
4116044 root      25   5   37424   8052   3968 R  50.3   0.2   2:55.28 stress-ng-cpu                  0
4116413 root      25   5   37424   6840   3840 R  50.3   0.2   2:22.32 stress-ng-cpu                  0
3248246 root      20   0  632972  25228   5376 S   1.0   0.7 194:10.01 barad_agent                    1
3342034 root      20   0 1047928 130120  32224 S   1.0   3.5 180:48.14 YDService                      2
3248245 root      20   0   43292  10904   3456 S   0.7   0.3  13:04.60 barad_agent                    2
      1 root      20   0  171912  11392   6912 S   0.0   0.3   7:36.23 systemd                        3

这里可以看到两个压力测试工具已经绑定到 CPU 核心 0 上运行(P 列显示的值为 0)。CPU 使用率达到了 50%(两个进程共用一个 CPU 核心)。

结束进程

  • 使用 kill 4116044 4116413 命令结束两个压力测试工具进程。
结束进程
bash
  ~ kill 4116044 4116413  # 使用 'kill' 命令终止进程 ID 为 4116044 和 4116413 的进程
# 进程 4116409 的日志信息
stress-ng: info:  [4116409] skipped: 0  # 没有跳过任何测试
stress-ng: info:  [4116409] passed: 0   # 没有通过任何测试,任务未完成
stress-ng: info:  [4116409] failed: 1: cpu (1)  # 1 个 CPU 测试失败,原因是被终止
stress-ng: info:  [4116409] metrics untrustworthy: 0  # 度量值没有标记为不可信
stress-ng: info:  [4116409] unsuccessful run completed in 3 mins, 41.12 secs  # 测试运行了3分41秒,未能成功完成
# 进程 4116040 的日志信息
stress-ng: info:  [4116040] skipped: 0  # 没有跳过任何测试
stress-ng: info:  [4116040] passed: 0   # 没有通过任何测试,任务未完成
stress-ng: info:  [4116040] failed: 1: cpu (1)  # 1 个 CPU 测试失败,原因是被终止
stress-ng: info:  [4116040] metrics untrustworthy: 0  # 度量值没有标记为不可信
stress-ng: info:  [4116040] unsuccessful run completed in 4 mins, 14.06 secs  # 测试运行了4分14秒,未能成功完成

[2]  + 4116409 exit 2     stress-ng --cpu 1  # 进程 4116409 以退出码 2 结束,表示被终止
[1]  + 4116040 exit 2     stress-ng --cpu 1  # 进程 4116040 以退出码 2 结束,表示被终止
# 退出码 2 表示 stress-ng 进程由于异常原因被终止(通常是被 kill 命令杀死)